#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

void crear_disc(char* ruta);
char* llegir_pagina(int npag);
void modificar_pagina(int npag, char valor);

FILE* _file;
char* ruta = (char *) "disco";

// La pagina i el valor que llegirem i modificarem:
int pagina = 1;
char valor = 2;

// Funcio principal.
int main()
{
    // Creem el nou disc.
    crear_disc(ruta);
    printf("\nEl disc s'ha creat correctament.\n\n");

    // Llegim la pagina que volguem del disc.
    printf("Contingut original de la pagina %d:\n", pagina);
    char* buffer = llegir_pagina(pagina);
    for(int k=0; k<1024; k++)
        cout << (int)buffer[k];   //printf("%X",buffer[k]);
    delete(buffer);

    // Modifiquem i tornem a llegir la mateixa pagina.
    printf("\n\nContingut de la pagina %d despres de modificar-la:\n", pagina);
    modificar_pagina(pagina, valor);
    buffer = llegir_pagina(pagina);
    for(int k=0; k<1024; k++)
        cout << (int)buffer[k];   //printf("%X",buffer[k]);
    delete(buffer);

    printf("\n");
    return 0;
}

// Funcio per crear el disc.
void crear_disc(char* ruta)
{
    char buf0[1024];
    for (int i = 0; i < 1024; i++) buf0[i] = 0;
    char buf1[1024];
    for (int i = 0; i < 1024; i++) buf1[i] = 1;

    _file = fopen(ruta, "wb");
    bool par;

    for (int i = 0; i < 4096; i++)
    {
        par = ((i%2) == 0) ? true : false;
        if(par)
            fwrite(buf0, 1024, 1, _file);
        else
            fwrite(buf1, 1024, 1, _file);
    }
    fclose (_file);
}

// Funcio per llegir una pagina del disc.
char* llegir_pagina(int npag)
{
    // Allotgem l'espai necessari per la pagina que retornem.
    char*  pag = new char[1024];
    _file = fopen(ruta, "r");
    fseek (_file, (1024 * npag), SEEK_SET);
    return fread(pag, 1, 1024, _file) ? pag : (char *) "Error al llegir.";
}

// Funcio per modificar una pagina del disc.
void modificar_pagina(int npag, char valor)
{
    char buf[1024];
    for (int i = 0; i < 1024; i++) buf[i] = valor;

    _file = fopen(ruta, "wb");
    fseek (_file, (1024 * npag), SEEK_SET);
    fwrite(buf, 1024, 1, _file);
    fclose (_file);
}

